package main

import "fmt"

type CalculateMethod interface {
	Calculate(a, b int) int
}

//计算方法
type MethodAdd struct {
	Name string `json:"name"`
}

func (m *MethodAdd) Calculate(a, b int) int {
	return a + b
}

//计算器
type Calculator struct {
}

func (p *Calculator) Action(t int, a, b int) int {
	if t == 1 {
		f := FactoryMethod{
			MethodType: 1,
		}
		return f.NewMethod().Calculate(a, b)
	}
	return 0
}

//实例化计算方法
type FactoryMethod struct {
	MethodType int `json:"method_type"`
}

//通过工厂来创建对应的方法
func (p *FactoryMethod) NewMethod() CalculateMethod {
	switch p.MethodType {
	case 1:
		add := MethodAdd{
			Name: "add",
		}
		var M CalculateMethod

		M = &add
		return M
	}
	return nil
}

func main() {
	ca := Calculator{}
	fmt.Println(ca.Action(1, 1, 2))
}
